﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BarcodeLib;
using CES_Application.Helpers;
using DevComponents.DotNetBar;
using CES_Application.Models;
using CES_Application.Models.Dados;
using CES_Application.Models.Negocio;


namespace CES_Application.Telas
{
    public partial class Tela_Caixa : Office2007Form
    {
        FormPrincipal fp;
        Venda venda;
        Itemvenda itemVenda;
        NeogocioVendas negocioVendas;
        NegocioProduto negocioProduto;
        Produto produto;
        ItensVendaGrid itens;
        List<ItensVendaGrid> itensVenda;
        Decimal total=0;
        int qtd=0;
        int indiceCell = -1;


        public Tela_Caixa()
        {
            negocioVendas = new NeogocioVendas();
            negocioProduto = new NegocioProduto();
            InitializeComponent();
        }

        public Tela_Caixa(FormPrincipal fp)
        {
            negocioVendas = new NeogocioVendas();
            negocioProduto = new NegocioProduto();
            this.fp = fp;
            InitializeComponent();
        }

        private void Tela_Caixa_Load(object sender, EventArgs e)
        {
            rbnCodigo.Checked = true;
            itensVenda = new List<ItensVendaGrid>();
            gvwItens.AutoGenerateColumns = false;
            gvwItens.Font = new Font("Arial Rounded MT", 9, FontStyle.Bold);
            DesabilitaCampos();
            CarregaaBomboFormPag();
            
        }

        private void CarregaaBomboFormPag()
        {
            cbxFormPag.DataSource = negocioVendas.ObterTodosFG();
            cbxFormPag.ValueMember = "idFormaPagamento";
            cbxFormPag.DisplayMember = "descricao";
        }

        private void Tela_Caixa_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.fp.IsMdiContainer = false;
        }

        private void lblTotal_Leave(object sender, EventArgs e)
        {

            decimal numero = decimal.Parse(lblTotal.Text);
            lblTotal.Text = numero.ToString("N2");

        }

        private void lblQtdItens_Leave(object sender, EventArgs e)
        {

        }




        private void DesabilitaCampos()
        {
            btnFinalizar.Enabled = false;
            btnNovaVenda.Enabled = true;
            gbxBtnProduto.Enabled = false;
            gbxFormPagamento.Enabled = false;
            gbxProduto.Enabled = false;
            tbxtotalAVista.Enabled = false;
            tbxTotal.Enabled = false;
            tbxValorPago.Enabled = false;
            tbxTroco.Enabled = false;
        }

        private void HabilitaCampos()
        {
            btnFinalizar.Enabled = true;
            btnNovaVenda.Enabled = false;
            gbxBtnProduto.Enabled = true;
            gbxFormPagamento.Enabled = true;
            gbxProduto.Enabled = true;
            tbxtotalAVista.Enabled = true;
            tbxTotal.Enabled = true;
            tbxValorPago.Enabled = true;
            tbxTroco.Enabled = true;

        }

        private void LimpaCampos()
        {
            tbxCampoPesq.Clear();
            tbxDesconto.Clear();
            tbxQtd.Clear();
            tbxTotal.Clear();
            tbxtotalAVista.Clear();
            tbxTroco.Clear();
            tbxValorCheque.Clear();
            tbxValorEntrada.Clear();
            tbxValorPago.Clear();
            lblQtdItens.Text = "0";
            lblTotal.Text = "0.00";
            CarregaaBomboFormPag();
            
        }

        private void btnNovaVenda_Click(object sender, EventArgs e)
        {
            LimpaCampos();
            HabilitaCampos();
             total = 0;
             qtd = 0;
             indiceCell = -1;
             produto = new Produto();
        }

        private void btnFinalizar_Click(object sender, EventArgs e)
        {
            
            if (gvwItens.RowCount > -1) 
            {
                try
                {
                    negocioVendas.InserirVenda(CarregarDadosVenda());
                    negocioVendas.InserirItemVenda(CarregarDadosItemVenda());
                    lblMsg.Text = "VENDA EFETUADA!";
                    gbxCodVenda.Visible = true;
                    lblCodigoVendaExibi.Text = venda.idVenda.ToString();
                }
                catch
                {
                    lblMsg.Text = "ERROR NO CADASTRO";
                }
            }
            DesabilitaCampos();
            

        }

        private Venda CarregarDadosVenda()
        {
            venda = new Venda();

            venda.Usuario_idUsuario = 1;
            venda.bandeiraCartao = cbxBandeiraCart.SelectedText;
            if (!string.IsNullOrEmpty(tbxDesconto.Text))
               venda.desconto = Convert.ToDecimal(tbxDesconto.Text);
            
            venda.FormaPagamento_idFormaPagamento = Convert.ToInt32(cbxFormPag.SelectedValue);
            
            if(cbxNParcelas.SelectedValue != null)
               venda.parcelas = Convert.ToInt32(cbxNParcelas.SelectedValue.ToString());
            if (!string.IsNullOrEmpty(tbxTroco.Text))
                venda.troco = Convert.ToDecimal(tbxTroco.Text);
            if (!string.IsNullOrEmpty(tbxtotalAVista.Text))
                venda.valorAvista = Convert.ToDecimal(tbxtotalAVista.Text);
            if (!string.IsNullOrEmpty(tbxValorCheque.Text))
                venda.valorChegue = Convert.ToDecimal(tbxValorCheque.Text);
            if (!string.IsNullOrEmpty(tbxValorEntrada.Text))
               venda.valorEntrada = Convert.ToDecimal(tbxValorEntrada.Text);
            if (!string.IsNullOrEmpty(tbxValorPago.Text))
                venda.valorPago = Convert.ToDecimal(tbxValorPago.Text);
            if (!string.IsNullOrEmpty(tbxTotal.Text))
                venda.valorTotal = Convert.ToDecimal(tbxTotal.Text);
            venda.dataEntrada = DateTime.Now;
            venda.dataAlteracao = DateTime.Now;
            venda.dataVenda = DateTime.Now;

            return venda;
        }

        private Itemvenda CarregarDadosItemVenda()
        {
            itemVenda = new Itemvenda();
            for (int i = 0; i < itensVenda.Count; i++)
            {
                itemVenda.precoTotal = itensVenda[i].Total;
                itemVenda.precoUnitario = itensVenda[i].Valor;
                itemVenda.Produto_idProduto = itensVenda[i].IdProduto;
                itemVenda.quantidade = itensVenda[i].Quantidade;
                negocioProduto.AtualizaEstoque(itensVenda[i].Quantidade, itensVenda[i].IdProduto);
                itemVenda.Venda_idVenda = venda.idVenda;
                
            }

            return itemVenda;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            produto= new Produto();
            itens  = new ItensVendaGrid();
            if (rbnCodBarras.Checked == true && tbxCampoPesq.Text!="")
            {
               produto = negocioProduto.ObterProdutoAddVenda(tbxCampoPesq.Text, 0);
            }
            else 
            {
                if (rbnCodigo.Checked == true && tbxCampoPesq.Text != "")
                    produto = negocioProduto.ObterProdutoAddVenda("", Convert.ToInt32(tbxCampoPesq.Text));
                else
                    lblMsg.Text = "CAMPO CÓD. INVÁLIDO!";
 
            }
            if(tbxQtd.Text != "")
            {
                if (Convert.ToInt32(tbxQtd.Text) > produto.quantidadeEstoque)
                {
                    lblMsg.Text = "QUANTIDADE MAIOR QUE ESTOQUE!";
                }
                else
                {
                    itens.IdProduto = produto.idProduto;
                    itens.CodBarras = produto.codBarras;
                    itens.Descricao = produto.descricao;
                    itens.Quantidade = Convert.ToInt32(tbxQtd.Text);
                    itens.Valor = (Decimal)produto.valorVenda;
                    itens.Total = (Decimal)produto.valorVenda * itens.Quantidade;
                    total += itens.Total;
                    qtd += itens.Quantidade;
                    lblQtdItens.Text = Convert.ToString(qtd);
                    lblTotal.Text = Convert.ToString(total);
                    tbxTotal.Text = Convert.ToString(total);
                    itensVenda.Add(itens);

                    gvwItens.DataSource = itensVenda.ToList();
                }
            }
            else
            {
                lblMsg.Text="CAMPO QUANTIDADE INVÁLIDO!";
            }
            tbxQtd.Clear();
            tbxCampoPesq.Clear();
            itens = null;
            produto = null;

        }

        private void btnRemove_Click(object sender, EventArgs e)
        {
            if (indiceCell >= 0)
            {
                itensVenda.RemoveAt(indiceCell);
                gvwItens.DataSource = itensVenda.ToList();
                total = 0;
                qtd = 0;

                for (int i = 0; i < itensVenda.Count; i++)
                {
                    total += itensVenda[i].Total;
                    qtd += itensVenda[i].Quantidade;
                }
                lblQtdItens.Text = Convert.ToString(qtd);
                lblTotal.Text = Convert.ToString(total);
                tbxTotal.Text = Convert.ToString(total);
            }
            else 
            {
                total = 0;
                qtd = 0;
                lblQtdItens.Text = Convert.ToString(qtd);
                lblTotal.Text = Convert.ToString(total);
                tbxTotal.Text = Convert.ToString(total);
            }
        }

        private void gvwItens_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((e.RowIndex == -1) || (e.ColumnIndex == -1))
            {
                indiceCell = -1;
                return;
            }
            else
            {
                indiceCell = e.RowIndex;
            }
        }

        private void tbxTotal_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxtotalAVista_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxTroco_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxValorPago_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxValorEntrada_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxValorCheque_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxValorAvista_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxDesconto_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }

            
        }

        private void tbxValorAvista_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxValorCheque_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxValorEntrada_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxQtd_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }

            
        }

        private void tbxCampoPesq_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxValorPago_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxTroco_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxTotal_TextChanged(object sender, EventArgs e)
        {

            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxtotalAVista_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxDesconto_Leave(object sender, EventArgs e)
        {
            if (tbxDesconto.Text != "")
            {
                Decimal valor = Convert.ToDecimal(tbxTotal.Text) - (Convert.ToDecimal(tbxDesconto.Text) * Convert.ToDecimal(tbxTotal.Text) / 100);
                tbxtotalAVista.Text = Convert.ToString(valor);
            }
        }

        private void cbxBandeiraCart_SelectedValueChanged(object sender, EventArgs e)
        {
            cbxNParcelas.Enabled = true;
        }

        private void tbxQtd_Leave(object sender, EventArgs e)
        {
            lblMsg.Text = "";
        }

    }
}
